IntelliJ Platform/MCP.ipynb (163 lines of code) (raw):
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": [
"# MCP Server Toolset Implementation\n",
"\n",
"This notebook creates a custom **Model Context Protocol (MCP) toolset** that exposes a `shakeIde` command to MCP clients.\n",
"\n",
"The command shakes your JetBrains IDE window using IntelliJ Platform SDK."
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-07-10T11:19:03.720646Z",
"start_time": "2025-07-10T11:19:03.563158Z"
}
},
"cell_type": "code",
"source": "%use intellij-platform",
"outputs": [
{
"data": {
"text/plain": [
"IntelliJ Platform integration is loaded"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 1
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Load the MCP Server bundled plugin using its `com.intellij.mcpServer` ID."
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-07-10T11:19:03.765860Z",
"start_time": "2025-07-10T11:19:03.728673Z"
}
},
"cell_type": "code",
"source": "loadPlugins(\"com.intellij.mcpServer\")",
"outputs": [],
"execution_count": 2
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"Implement the `McpToolset` extension with an example code that shakes the current IDE using a built-it `DialogEarthquakeShaker` utility class.\n",
"Using the `registerExtension` helper, register the implemented extension as `com.intellij.mcpServer.mcpToolset`."
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-07-10T11:19:03.855623Z",
"start_time": "2025-07-10T11:19:03.769942Z"
}
},
"cell_type": "code",
"source": [
"import com.intellij.openapi.application.ApplicationManager\n",
"import com.intellij.openapi.ui.DialogEarthquakeShaker\n",
"import com.intellij.openapi.wm.WindowManager\n",
"import com.intellij.mcpserver.McpToolset\n",
"import com.intellij.mcpserver.annotations.McpDescription\n",
"import com.intellij.mcpserver.annotations.McpTool\n",
"import com.intellij.mcpserver.project\n",
"import kotlinx.coroutines.delay\n",
"import kotlin.coroutines.coroutineContext\n",
"\n",
"class ShakeMcpToolset : McpToolset {\n",
"\n",
" @McpTool\n",
" @McpDescription(\"Shakes your JetBrains IDE 😵💫\")\n",
" suspend fun shakeIde(\n",
" @McpDescription(\"How many times to shake your IDE?\")\n",
" times: Int = 1\n",
" ) {\n",
" val project = coroutineContext.project\n",
" val window = WindowManager.getInstance().getFrame(project)\n",
"\n",
" repeat(times) {\n",
" DialogEarthquakeShaker.shake(window)\n",
" delay(500)\n",
" }\n",
" }\n",
"}\n",
"\n",
"registerExtension(McpToolset.EP, ShakeMcpToolset())"
],
"outputs": [],
"execution_count": 3
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"## Testing\n",
"\n",
"Make sure that the JetBrains MCP Server is enabled in [⚙️ Settings | Tools | MCP Server](jetbrains://idea/settings?name=Tools--MCP+Server) and copy its URL, like `http://127.0.0.1:64342/sse`\n",
"\n",
"As soon as the extension is registered, you can test it using the [MCP Inspector tool](https://modelcontextprotocol.io/docs/tools/inspector):\n",
"\n",
"```shell\n",
"npx @modelcontextprotocol/inspector\n",
"```\n",
"\n",
"When running, _🔗 Open inspector with token pre-filled:_ `http://localhost:6274/?MCP_PROXY_AUTH_TOKEN=foo`\n",
"\n",
"Configure the connection and set the _Transport Type_ to `SSE`, the MCP Server URL, and establish the connection.\n",
"\n",
"Find the `shakeIde` entry in the tool list, set the `times` parameter to any number, and click the _Run tool_ button."
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"## Integration with standalone plugins\n",
"\n",
"To register the extension within a standalone plugin, use:\n",
"```xml\n",
"<idea-plugin>\n",
" ...\n",
" <extensions defaultExtensionNs=\"com.intellij\">\n",
" <mcpServer.mcpToolset implementation=\"com.example.ShakeMcpToolset\"/>\n",
" </extensions>\n",
"</idea-plugin>\n",
"```"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Kotlin",
"language": "kotlin",
"name": "kotlin"
},
"language_info": {
"name": "kotlin",
"version": "1.9.23",
"mimetype": "text/x-kotlin",
"file_extension": ".kt",
"pygments_lexer": "kotlin",
"codemirror_mode": "text/x-kotlin",
"nbconvert_exporter": ""
},
"ktnbPluginMetadata": {
"sessionRunMode": "IDE_PROCESS"
}
},
"nbformat": 4,
"nbformat_minor": 0
}